home *** CD-ROM | disk | FTP | other *** search
/ Trusted Irix /B 4.0.4 / Trusted-Irix B-4.0.1.iso / dist / eoe1.idb / usr / include / sys / dsglue.h.z / dsglue.h
C/C++ Source or Header  |  1992-04-03  |  6KB  |  170 lines

  1. #ifndef __SYS_DSGLUE_H__
  2. #define __SYS_DSGLUE_H__
  3.  
  4. /**************************************************************************
  5.  *                                      *
  6.  *          Copyright (C) 1990, Silicon Graphics, Inc.          *
  7.  *                                      *
  8.  *  These coded instructions, statements, and computer programs  contain  *
  9.  *  unpublished  proprietary  information of Silicon Graphics, Inc., and  *
  10.  *  are protected by Federal copyright law.  They  may  not be disclosed  *
  11.  *  to  third  parties  or copied or duplicated in any form, in whole or  *
  12.  *  in part, without the prior written consent of Silicon Graphics, Inc.  *
  13.  *                                      *
  14.  **************************************************************************/
  15. /*
  16.  * dsglue.h - devscsi glue layer
  17.  *
  18.  *    Copyright 1988, 1989, by
  19.  *    Gene Dronek (Vulcan Laboratory) and
  20.  *    Rich Morin  (Canta Forda Computer Laboratory).
  21.  *    All Rights Reserved.
  22.  *    Ported to SGI by Dave Olson 3/89
  23.  *
  24.  *    This file is normally used only by the kernel.  All system-
  25.  *    dependent items should be here.  See also dsreq.h
  26.  */
  27. #ident "$Revision: 1.7 $"
  28.  
  29. #ifdef sgi && !defined(__STDC__)
  30. # define __STDC__    /* not quite, but real close */
  31. #endif
  32.  
  33. /*
  34.  *  The DEVSCSI driver takes one UNIX major device number for each
  35.  *  SCSI bus (host adaptor).  Up to (B_MAX) busses can be supported.
  36.  *  Each SCSI bus supports up to 8 (I_MAX) SCSI devices.  
  37.  *
  38.  *  Furthermore, DEVSCSI uses the UNIX minor device number to encode
  39.  *  the device ID, LUN, and two (installation-dependent) control bits.
  40.  *  The DEVSCSI driver supports 8 LUN's (L_MAX) per device, but some
  41.  *  installations may not support more than one LUN.
  42.  *
  43.  *        major bits            minor bits
  44.  *     7 6 5 4 3 2 1 0       7 6 5 4 3 2 1 0
  45.  *     ---------------       ---------------
  46.  *     - - - bus - - -       c c l l l i i i
  47.  *
  48.  *  macros for converting  dev to bus, ctrl, lun and id
  49.  *  at SGI, control bits are used to indicate adapter #
  50.  *  within a controller type (powerchannel supports up to 4
  51.  *  scsi channels with the same interface).
  52.  */
  53. #define get_id(dev)   (0x7 & (minor(dev)))
  54. #define get_lun(dev)  (0x7 & (minor(dev)) >> 3)
  55. #define get_ctrl(dev) (0x7 & (minor(dev)) >> 6)    /* same as bus at SGI */
  56. #define get_bus(dev)  get_ctrl(dev)
  57. #define get_role(dev) (0)    /* target role not implemented */
  58.  
  59. /* per-bus gluer interface */
  60.  
  61. typedef struct gluer  {
  62.   char   *glue_ident;        /* identification of host/glue  */
  63.   char    glue_status;        /* status of host/gluer           */
  64.   int   (*glue_init)();        /* initialize gluer             */
  65.                 /* (struct task_desc *, short)    */
  66.   int   (*glue_reserve)();    /* reserve host adapter         */
  67.                 /* (struct task_desc *, short)    */
  68.   int   (*glue_start)();    /* start host request             */
  69.                 /* (struct task_desc *, int)     */
  70.   void   (*glue_return)();    /* passback host request           */
  71.                 /* (struct task_desc *, int)    */
  72.   int   (*glue_release)();    /* release host adapter         */
  73.                 /* (struct task_desc *)        */
  74.   int   (*glue_cancel)();    /* cancel an active request     */
  75.                 /* (struct task_desc *)     */
  76.   int   (*glue_getopt)();    /* get persistant host flags     */
  77.                 /* (long)        */
  78.   int   (*glue_setopt)();    /* set persistant host flags     */
  79.                 /* (long)        */
  80.   ulong   glue_support;        /* dsreq option flags supported */
  81.   ulong   glue_default;        /* dsreq option flags defaulted */
  82. } gluer_t;
  83.  
  84.  
  85. /* g_status definitions */
  86. #define BUS_INIT    1    /* bus (and gluer) initialized and up */
  87.  
  88.  
  89. extern struct gluer gluers[B_MAX];
  90.  
  91. #define SPLSCSI spl5     /* high enough to disable scsi interrupts */
  92.  
  93. #ifdef sgi
  94. # define _CALLOC(ptr, x) { ptr = kern_calloc(x, 1); }
  95. # define _CFREE(x) kern_free(x)
  96. #else /* AUX */
  97. # define _CALLOC(ptr, x) { ptr = kmem_alloc(x); if(ptr) bzero(ptr, x); }
  98. # define _CFREE(x)  kmem_free(x)
  99.  caddr_t kern_alloc();
  100. #endif /* sgi */
  101.  
  102. #ifdef DEBUG
  103. short dsdebug;
  104. # define DBG(s) {if(dsdebug) {s;} }
  105. #else
  106. # define DBG(s)
  107. #endif
  108.  
  109. /* declared here because called from both dsreq.c and dsglue.c */
  110. #ifdef __STDC__
  111. void dma_unlock(register struct dsiovec *, long, int);
  112. #else __STDC__
  113. void dma_unlock();
  114. #endif /* __STDC__ */
  115.  
  116.  
  117. /*
  118.  *    Interface structures between generic portion of DEVSCSI driver
  119.  *    and system-dependent glue layer.
  120.  *    Each request is allocated a separate task descriptor.
  121.  */
  122.  
  123. typedef struct task_desc  {
  124.   uchar_t     td_bus, td_id;     /* bus number, device id 0-7    */
  125.   uchar_t     td_lun, td_role;   /* lun 0-7, and role 0-1    */
  126.   uchar_t     td_cmdbuf[16];    /* cmd to be issued        */
  127.   uchar_t     td_sensebuf[100];    /* place to receive sensedata    */
  128.   uchar_t     td_msgbuf[6];    /* place to receive msg info    */
  129.   dsiovec_t  td_iovbuf[V_MAX];    /* array of data dma vectors    */
  130.   dsiovec_t  td_iovdummy[1];    /* buffered data dma vector     */
  131.     /* td_devtype is after a pointer so will be aligned for dma */
  132.   uchar_t     td_devtype;        /* SCSI device type, from inquiry */
  133.   uchar_t     td_cmdlen;        /* len of cmd in cmdbuf        */
  134.   uchar_t     td_senselen;    /* len of returned sense data    */
  135.   uchar_t     td_msglen;        /* len of returned msg info    */
  136.   u_short    td_iovlen;        /* len of io vectors present    */
  137.   u_long     td_datalen;    /* requested/returned length    */
  138.   u_long     td_flags;        /* filtered dsrq request flags  */
  139.   u_long     td_iflags;        /* flags internal to driver */
  140.   uchar_t     td_status;        /* device status byte return    */
  141.   u_short    td_state;        /* task state            */
  142.   u_short    td_ret;        /* return code from glue layer  */
  143.   u_short    td_retry;        /* retry count            */
  144.   u_long     td_time;        /* timeout in ms        */
  145.   caddr_t    td_dsreq;        /* ptr to devscsi data struct   */
  146.   caddr_t    td_hsreq;        /* ptr to host scsi data struct */
  147.   struct buf td_buf;        /* for use with r/w interface      */
  148. } task_desc_t;
  149.  
  150. /*
  151.  *  definitions for task td_state
  152.  */
  153. #define TDS_START    0    /* not initialized */
  154. #define TDS_INIT    1    /* space allocated */
  155. #define TDS_TASK    2    /* task present    */
  156. #define TDS_RUN     3    /* task running */
  157. #define TDS_INTERIM     4    /* host completed, need entero called */
  158. #define TDS_WAITASYNC    5    /* async request in progress */
  159. #define TDS_DONE    6    /* request completed */
  160.  
  161.  
  162. /*  definitions for task td_iflags */
  163. #define TASK_INTERNAL  0x1    /* internal call to driver */
  164. #define TASK_HAVETYPE    0x2    /* used for read/write interface. If set,
  165.     an inquiry has been done, so we know what form of read/write
  166.     command to use. */
  167. #define TASK_RESET    0x4 /* reset the scsi bus; used to implement DS_RESET */
  168.  
  169. #endif /* __SYS_DSGLUE_H__ */
  170.